/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package br.com.agi.myhome.servicos;

import br.com.agi.myhome.dominio.DominioException;
import br.com.agi.myhome.dominio.EstoqueProduto;
import br.com.agi.myhome.dominio.Produto;
import java.util.List;
import javax.ejb.Stateless;
import javax.persistence.NoResultException;
import javax.persistence.Query;
import javax.persistence.criteria.*;

/**
 *
 * @author Renato
 */
@Stateless
public class CadastradorProdutoImpl extends ManipuladorEntidadeAbs<Produto> implements CadastradorProduto {  
    
    @Override
    protected Class<Produto> getType() {
        return Produto.class;        
    }    

    @Override
    protected Object getId(Produto entidade) {
        return entidade.getCodigo();
    }

    @Override
    public void adicionarEstoque(EstoqueProduto estoqueProduto) {
        
        EstoqueProduto ep;
        
        Query q=this.createQueryEstoqueProdut(estoqueProduto);
        try{
            ep=(EstoqueProduto) q.getSingleResult(); 
            ep.adicionarQuantidade(estoqueProduto);
            em.merge(ep);
            em.flush();
            
        }catch(NoResultException nop){
            ep=estoqueProduto;
            em.merge(ep);
            em.persist(ep);
        }       
    }
    
    private Query createQueryEstoqueProdut(EstoqueProduto estoqueProduto){
        Query q=em.createQuery("select x from EstoqueProduto x where x.estoque=:estoque and x.produto=:produto");
        q.setParameter("estoque", estoqueProduto.getEstoque());
        q.setParameter("produto" , estoqueProduto.getProduto());
        return q;
    }
    
    @Override
    public void removerEstoque(EstoqueProduto estoqueProduto) throws DominioException {
        EstoqueProduto ep;
         Query q=this.createQueryEstoqueProdut(estoqueProduto);
        try{
            ep=(EstoqueProduto) q.getSingleResult(); 
            ep.removerQuantidade(estoqueProduto);
            if(ep.getQuantidade()==0){
                em.remove(ep);
            }else{
                em.merge(ep);
            }
            em.flush();
            
        }catch(NoResultException nop){
            throw new DominioException("Estoque inexistente");            
        }  
    }

    @Override
    public List<EstoqueProduto> getListaEstoqueProduto() {
        ListadorEntidade<EstoqueProduto> listadorEstoqueProduto;
        listadorEstoqueProduto=new ListadorEntidade<EstoqueProduto>();
        listadorEstoqueProduto.setEntityManager(em);
        return listadorEstoqueProduto.getLista(EstoqueProduto.class);        
    }

    @Override
    public List<EstoqueProduto> getListaEstoqueProduto(Produto produto) {
        CriteriaBuilder cb;
        CriteriaQuery<EstoqueProduto> query;
        
        
        cb=em.getCriteriaBuilder(); 
        query=cb.createQuery(EstoqueProduto.class);
        Root <EstoqueProduto> rfrom=query.from(EstoqueProduto.class);
       
        
        Expression<Produto> param;
        param=rfrom.get("produto");
        
        Predicate restrict;
        restrict=cb.equal(param, produto);        
        query.select(rfrom).where(restrict);               
        List<EstoqueProduto> retorno;
        retorno=em.createQuery(query).getResultList();
        return    retorno;     
    }

    
    
   
    
}
